package com

import java.util.concurrent.ConcurrentHashMap

/**
 * 将当前 ConcurrentHashMap 中的所有条目迁移到目标 Map 中，并在迁移成功后移除原条目。
 * 注意：该方法不是线程安全的，若在并发环境中调用，请自行加锁保护。
 * 同时请确保 target 是线程安全的（如 ConcurrentMap）以避免并发写入问题。
 *
 * @param target 要迁入的目标 Map
 * @throws RuntimeException 如果在迁移过程中发生异常（例如目标 Map 不接受某些键值）
 */
fun <K, V> ConcurrentHashMap<K, V>.drainTo(target: MutableMap<K, V>) {
    val iterator = this.iterator()
    while (iterator.hasNext()) {
        val entry = iterator.next()
        try {
            // 尝试放入目标 Map
            target.put(entry.key, entry.value)
            // 仅在 put 成功后才删除源中的条目，防止数据丢失
            iterator.remove()
        } catch (e: Exception) {
            // 抛出运行时异常并附带原始键信息，便于调试
            throw RuntimeException("Failed to drain map entry with key: ${entry.key}", e)
        }
    }
}